package grade.calculate.log;

import grade.calculate.event.Event;

import java.lang.reflect.Proxy;
import java.util.Optional;

/**
 * 日志输出
 *
 * @author fromdrowning
 * @date 2024/2/28 23:14
 */
public class Log {

    /**
     * 创建事件的代理对象 对原run方法进行增强 输出日志
     *
     * @param event 读取方法执行完后触发的事件
     * @return {@link Event} 事件的代理对象
     */
    public static Event printEventLog(Event event) {
        return (Event) Proxy.newProxyInstance(Log.class.getClassLoader(),
                new Class[]{Event.class},
                (proxy, method, args) -> {
                    // 代理前判断事件是否为null 为null抛异常
                    Optional.ofNullable(event)
                            .orElseThrow(() -> new RuntimeException("添加的事件不能为空"));

                    // 执行原run方法逻辑前得到开始时间
                    long start = System.currentTimeMillis();

                    // 执行原run方法逻辑
                    Object invoke = method.invoke(event, args);

                    // 执行原run方法逻辑后得到结束时间 计算原run方法的运行时间并输出
                    long end = System.currentTimeMillis();
                    System.out.println(event.getClass().getSimpleName() + "执行完成 共耗时" + (end - start) / 1000.0 + "秒");

                    return invoke;
                });
    }
}
